package OperationSystem.MultiplyThread;

public class Thread_adv_speed {
    private static final long COUNT = 10_0000_0000L;
    private static final int N = 10;      //一共计算10次

    private static void calc() {
        long r = 0;
        for (long i = 0; i < COUNT; i++) {
            r += i;
        }
        System.out.println(r);
    }

    private static class CalcThread extends Thread {
        @Override
        public void run() {
            //一个线程只需要计算一遍calc
            calc();
        }
    }

    public static void main(String[] args) throws InterruptedException {
        long start = System.nanoTime();

        CalcThread[] threads = new CalcThread[N - 1];
        //N个线程同时执行，主线程不需要创建，所以需要创建N-1个子线程
        for (int i = 0; i < N - 1; i++) {
            //创建了N-1个线程，每个线程都执行一次
            CalcThread thread = new CalcThread();
            thread.start();
            threads[i]=thread;//执行threads线程
        }
        calc();//剩余的一次，放到主线程中来计算
        //代码走到这里，只代表主线程结束了，其余N-1个线程是否结束无法知道

        for (int i = 0; i < N - 1; i++) {
            threads[i].join();//join方法-->阻塞在这个方法上，直到threads[i]线程执行结束
        }

        //这时代表所有线程执行结束
        long end = System.nanoTime();
        System.out.println((end - start) * 1.0 / 1000 / 1000);
    }


    /*
    1、主线程一个线程在执行计算
    public static void main1(String[] args) {
        long start=System.nanoTime();
        for (int i=0;i<N;i++){
            calc();
        }
        long end=System.nanoTime();
        System.out.println((end-start)*1.0/1000/1000);
    }*/
}
